import java.util.Arrays;
import java.util.PriorityQueue;

public class 课程表III {
    public int scheduleCourse(int[][] courses) {
        int n = courses.length; // 课程的数量
        // 按照结束时间进行排序操作
        Arrays.sort(courses,(a,b) -> {
            return a[1] - b[1];
        });
        int time = 0; // 记录此时的时间
        PriorityQueue<Integer> heap = new PriorityQueue<>((a,b) -> b - a); // 大根堆排序, 当满了以后, 舍弃掉最大的任务
        for (int[] x : courses) {
            if (time + x[0] <= x[1]) { // 如果当前时间 + 当前项目的 持续时间 不超过 结束时间
                heap.add(x[0]); // 将项目加入到堆中
                time += x[0]; // 时间也要 ++
            } else {
                // 如果当前项目加入以后发现超过了结束时间, 判断堆中是否存在元素并且堆顶元素大于当前元素, 就弹出最大元素
                if (!heap.isEmpty() && heap.peek() > x[0]) {
                    time = time - heap.poll() + x[0]; // 修改当前时间
                    heap.add(x[0]); // 加入大根堆中
                }
            }
        }
        return heap.size(); // 最后返回堆中有多少个课程
    }
}
